Jelly, 你的评论 markdown解析是用哪个?代码部分渲染成黑色高亮,求指教 !!!!谢谢啦
厉害了World哥,一行秒杀。
单独创建项目名称:collections
,可以是空文件夹
终端进入目录使用composer安装package
终端执行命令,引入collection
composer require illuminate/support
终端执行命令,单独引入dump,dd
等方法的package
composer require pandeydip/dump-die
PS:基本上到达这一步就就可以单独实现视频中效果,如果是中途加入的这两个package,那么需要在终端执行命令composer dump-autoload
,更新一下自动加载环境
模拟创建index
<?php
//自行手打模拟视频测试数据
require __DIR__ . '/vendor/autoload.php';
$orders = [[
'id' => 1,
'user_id' => 1,
'number' => '13908080808',
'status' => 0,
'fee' => 10,
'discount' => 44,
'order_products'=> [
['order_id'=>1,'product_id'=>1,'param'=>'6寸','price'=>555.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]],
['order_id'=>1,'product_id'=>1,'param'=>'7寸','price'=>333.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]],
],
]];
$price = 0;
foreach( $orders as $order ){
foreach( $order['order_products'] as $order_product ){
$price += $order_product['price'];
}
}
dump( $price );
使用collection中提供的map
方法,返回大数组中的子数组【打印出来的是一个索引的三维数组】
dump( collect( $orders )->map(function($order){
return $order['order_products'];
}) );
然后我们可以利用collection提供的flatten
方法,将现在出现的数组直接变成items下的平级数组【其实打印出来就是一个索引的二维数组】
dump( collect( $orders )->map( function( $order ){
return $order['order_products'];
} )->flatten(1) );
继续使用map
方法,然后返回$order['price']
,那么打印出来的将会是纯price
值的索引数组,这样就可以顺利计算价格的总和了
dump( collect( $orders )->map( function( $order ){
return $order['order_products'];
} )->flatten(1)->map( function( $order ){
return $order['price'];
} ) );
使用sum
方法计算出价钱的总和
dump( collect( $orders )->map( function( $order ){
return $order['order_products'];
} )->flatten(1)->map( function( $order ){
return $order['price'];
} )->sum() );
上面描述步骤,算是使用的第一方案完成。代码体比两层foreach要大,下面记录视频中使用的第二种方案,更简洁
使用flatMap
方法,替换第一行的map
collect( $orders )->flatMap( function( $order ){#代码体
使用pluck
方法传入要操作的key:price
dump( collect( $orders )->flatMap( function( $order ){
return $order['order_products'];
} )->pluck('price')->sum() );
当然如果不使用pluck
方法的话可以直接传参到sum
方法中
dump( collect( $orders )->flatMap( function( $order ){
return $order['order_products'];
} )->sum('price') );
PS:上传两种方案操作起来都比较舒服。效果跟视频一致,第二种方式,真的是我有很爽的感觉。多谢Jelly分享。大大的赞
Hi,Jelly。我想请教一下,我用原生html标签做了表单那一块的页面胆码,但select标签,编辑页面怎么让他显示 getTagListAttribute没作用到页面上呢,
页面上增加收藏按钮,
@extends('app')
@section('content')
{--chunk(3)这里实现的是每一行显示三个,就是把一个大数据分整3个一组的大二维数组--}
@foreach( $lessons->chunk(3) as $row )
<div class="row">
@foreach( $row as $lesson )
<article class="col-md-4">
<h2>
{ $lesson->title }
</h2>
<img src="{$lesson->image}" width="360" alt="">
<div class="body">
<form action="/favorite" method="post">
{ csrf_token() }
<input type="hidden" name="lesson_id" value="{ $lesson->id }">
<button type="submit" class="btn btn-primary">收藏</button>
</form>
{--下面增加--}
{ $lesson->intro }
</div>
</article>
@endforeach
</div>
@endforeach
{!! $lessons->appends( ['type'=>'article'] )->render() !!}
@stop
终端命令生成控制器
php artisan make:controller FavoritesController
注册路由
Route::resource( '/favorite','FavoritesController' );
收藏控制器中store方法增加代码
public function store(Request $request)
{
Auth::user()->favorites()->attach( $request->get( 'lesson_id' ) );
return redirect()->back();
}
到这一步测试,遇到三个问题,分别解决
第一个问题,是页面token问题,我直接使用的是表单,并没有使用FORM那个插件,页面token使用错误,更正为:
<form action="/favorite" method="post">
{ csrf_field() }
<input type="hidden" name="lesson_id" value="{ $lesson->id }">
<button type="submit" class="btn btn-primary">收藏</button>
</form>
第二个问题,传入控制器报错Auth没有找到,更改为:
public function store(Request $request)
{
//Auth前面加反斜杠,问题解决,顺利入库
\Auth::user()->favorites()->attach( $request->get( 'lesson_id' ) );
return redirect()->back();
}
第三个问题,视频中提到的需要把created_at
与updated_at
也需要写入数据库,在用户模型方法中的favorites修改为:
public function favorites()
{
return $this->belongsToMany(Lesson::class,'favorites')->withTimestamps();//后面再增加一个链式操作
}
增加收藏样式,由于没有使用字体图标,所以直接判断,使用bt样式进行变色
<form action="/favorite" method="post">
{ csrf_field() }
<input type="hidden" name="lesson_id" value="{ $lesson->id }">
<button type="submit" class="btn { in_array( $lesson->id,$favorites ) ? 'btn-success' : 'btn-primary' }">收藏</button>
</form>
刷新页面,报错favorites变量没定义,路由处定义
$favorites = \App\Favorite::where( 'user_id',Auth::user()->id )
->lists('lesson_id')->ToArray();
return view( 'lessons.index',compact('lessons','favorites'));
定义好后,刷新页面,竟然报lessons
未定义
最后找不到解决办法,已经开始怀疑传值的compact有问题,开始怀疑一个对象集一个是数组集合,这样使用compact传值是不是有问题,后来并没有找到相关资料
解决办法,我使用了with数组传值解决这一错误,
Route::get('/lessons',function(){
$lessons = \App\Lesson::latest()->paginate(15);#根据最近时间文章排序,取出每页15行数据
$favorites = \App\Favorite::where( 'user_id',Auth::user()->id )
->lists('lesson_id')->ToArray();
//使用compact传两个参数错误,怀疑是一个对象一个只是数组出错[自我怀疑,没有搜索到资料证实]
//使用with传值,无错误
return view( 'lessons.index')->with(['lessons'=>$lessons,'favorites'=>$favorites]);
});
重新定义页面,增加判断,加入取消收藏表单,直接表单,没有使用视频中讲师的插件包
@extends('app')
@section('content')
@foreach( $lessons->chunk(3) as $row )
<div class="row">
@foreach( $row as $lesson )
<article class="col-md-4">
<h2>
{ $lesson->title }
</h2>
<img src="{$lesson->image}" width="360" alt="">
<div class="body">
@if( in_array( $lesson->id,$favorites ) )
<form action="/favorite/{$lesson->id}" method="POST">
<input type="hidden" name="_method" value="DELETE">
@else
<form action="/favorite" method="post">
@endif
{ csrf_field() }
<input type="hidden" name="lesson_id" value="{ $lesson->id }">
<button type="submit" class="{ in_array( $lesson->id,$favorites ) ? 'btn btn-success' : 'btn btn-primary' }">收藏</button>
</form>
{ $lesson->intro }
</div>
</article>
@endforeach
</div>
@endforeach
{!! $lessons->render() !!}
@stop
控制器删除方法增加代码
public function destroy($id)
{
\Auth::user()->favorites()->detach( $id );
return redirect()->back();
}
为了实现登录限制,所以
登录后才能显示收藏按钮,页面增加判断
@if( Auth::check() )
//收藏表单html代码
@endif
控制器增加构造方法
public function __construct()
{
$this->middleware('auth');
}
同事也需要修改路由判断
Route::get('/lessons',function(){
$lessons = \App\Lesson::latest()->paginate(15);#根据最近时间文章排序,取出每页15行数据
//检查是否登录,跟视频会有出入,但效果实现一致
if( Auth::check() ){
$favorites = \App\Favorite::where( 'user_id',Auth::user()->id )
->lists('lesson_id')->ToArray();
//使用compact传两个参数错误,怀疑是一个对象一个只是数组出错
//使用with传值,无错误
return view( 'lessons.index')->with(['lessons'=>$lessons,'favorites'=>$favorites]);
}else{
return view( 'lessons.index')->with('lessons',$lessons);
}
});
显示用户自己的收藏列表,具体就需要自己做列表显示了,这里忽略
public function index()
{
\Auth::user()->favorites();
}
最后测试收藏与取消收藏
按钮颜色变换:成功
数据库增减数据:成功
PS:嗯,整体效果跟视频一样
mac下homebrew 下在了spervisor,但是配置那个环境哪里不管用了,我先mark下流程笔记吧,后面再装个虚拟机环境运行下
不客气 。加油一起上路吧
做到这里,brew里面也有 supervisor这个包下载么?网络上搜索过好像没有,我只能暂时放弃直接在本机环境下载这个。